package com.biz.primus.ms.thirdlogin.config;

import com.biz.primus.model.thirdlogin.enums.OAuthTypes;
import com.biz.primus.ms.thirdlogin.oauth.api.alipay.AlipayApi20;
import com.biz.primus.ms.thirdlogin.oauth.api.qq.QQApi20;
import com.biz.primus.ms.thirdlogin.oauth.api.weibo.SinaWeiboApi20;
import com.biz.primus.ms.thirdlogin.oauth.api.weixin.WeixinApi20;
import com.biz.primus.ms.thirdlogin.oauth.service.CustomOAuthService;
import com.biz.primus.ms.thirdlogin.oauth.service.OAuthServiceDeractor;
import com.biz.primus.ms.thirdlogin.oauth.service.qq.QQOAuthService;
import com.biz.primus.ms.thirdlogin.oauth.service.weibo.SinaWeiboOAuthService;
import org.apache.commons.lang3.StringUtils;
import org.scribe.builder.ServiceBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author jun.liu
 * @date 2017/9/29
 */
@Configuration
public class OAuthConfig
{

    @Value("${oAuth.callback-url}")
    String CALLBACK_URL;

    /**
     * ============weixin============
     */
    @Value("${oAuth.weixin.appId}")
    String weixinAppId;
    @Value("${oAuth.weixin.appSecret}")
    String weixinAppSecret;

    @Bean
    public CustomOAuthService getWeixinOAuthService()
    {
        if(StringUtils.isNotBlank(weixinAppId)
                && StringUtils.isNotBlank(weixinAppSecret)
                && StringUtils.isNotBlank(CALLBACK_URL))
        {
            return (CustomOAuthService) new ServiceBuilder()
                    .provider(WeixinApi20.class)
                    .apiKey(weixinAppId)
                    .apiSecret(weixinAppSecret)
                    .scope("snsapi_login")
                    .callback(String.format(CALLBACK_URL, OAuthTypes.WEIXIN.name()))
                    .build();
        }
        return null;
    }
    /**============weixin============*/


    /**
     * ============QQ============
     */
    @Value("${oAuth.qq.state}")
    String state;
    @Value("${oAuth.qq.appId}")
    String qqAppId;
    @Value("${oAuth.qq.appKey}")
    String qqAppKey;

    @Bean
    public QQApi20 qqApi()
    {
        if(StringUtils.isNotBlank(state))
        {
            return new QQApi20(state);
        }
        return null;
    }

    @Bean
    public OAuthServiceDeractor getQQOAuthService()
    {
        if(StringUtils.isNotBlank(qqAppId)
                && StringUtils.isNotBlank(qqAppKey)
                && StringUtils.isNotBlank(CALLBACK_URL))
        {
            return new QQOAuthService(new ServiceBuilder()
                    .provider(qqApi())
                    .apiKey(qqAppId)
                    .apiSecret(qqAppKey)
                    .callback(String.format(CALLBACK_URL, OAuthTypes.QQ.name()))
                    .build());
        }
        return null;
    }
    /**============QQ============*/


    /**
     * ============weibo============
     */
    @Value("${oAuth.sina.appKey}")
    String sinaAppKey;
    @Value("${oAuth.sina.appSecret}")
    String sinaAppSecret;

    @Bean
    public OAuthServiceDeractor getSinaOAuthService()
    {
        if(StringUtils.isNotBlank(sinaAppKey)
                && StringUtils.isNotBlank(sinaAppSecret)
                && StringUtils.isNotBlank(CALLBACK_URL))
        {
            return new SinaWeiboOAuthService(new ServiceBuilder()
                    .provider(SinaWeiboApi20.class)
                    .apiKey(sinaAppKey)
                    .apiSecret(sinaAppSecret)
                    .callback(String.format(CALLBACK_URL, OAuthTypes.SINA_WEIBO.name()))
                    .build());
        }
        return null;
    }
    /**============weibo============*/

    /**
     * ============alipay============
     */
    @Value("${oAuth.alipay.appId}")
    String appId;
    //app私钥
    @Value("${oAuth.alipay.appPrivateKey}")
    String appPrivateKey;
    //公钥
    @Value("${oAuth.alipay.publicKey}")
    String publicKey;

    @Bean
    public AlipayApi20 alipayApi()
    {
        if(StringUtils.isNotBlank(publicKey))
        {
            return new AlipayApi20(publicKey);
        }
        return null;
    }

    @Bean
    public CustomOAuthService getAlipayOAuthService()
    {
        if(StringUtils.isNotBlank(appId)
                && StringUtils.isNotBlank(appPrivateKey)
                && StringUtils.isNotBlank(CALLBACK_URL))
        {
            return (CustomOAuthService) new ServiceBuilder()
                    .provider(alipayApi())
                    .apiKey(appId)
                    .apiSecret(appPrivateKey)
                    .callback(String.format(CALLBACK_URL, OAuthTypes.ALIPAY.name()))
                    .build();
        }
        return null;
    }
    /**============alipay============*/

}
